from langchain_core.messages import HumanMessageChunk
from langchain_core.outputs import ChatGenerationChunk, GenerationChunk


def test_generation_chunk() -> None:
    assert GenerationChunk(text="Hello, ") + GenerationChunk(
        text="world!"
    ) == GenerationChunk(
        text="Hello, world!"
    ), "GenerationChunk + GenerationChunk should be a GenerationChunk"

    assert (
        GenerationChunk(text="Hello, ")
        + GenerationChunk(text="world!", generation_info={"foo": "bar"})
        == GenerationChunk(text="Hello, world!", generation_info={"foo": "bar"})
    ), "GenerationChunk + GenerationChunk should be a GenerationChunk with merged generation_info"  # noqa: E501

    assert (
        GenerationChunk(text="Hello, ")
        + GenerationChunk(text="world!", generation_info={"foo": "bar"})
        + GenerationChunk(text="!", generation_info={"baz": "foo"})
        == GenerationChunk(
            text="Hello, world!!", generation_info={"foo": "bar", "baz": "foo"}
        )
    ), "GenerationChunk + GenerationChunk should be a GenerationChunk with merged generation_info"  # noqa: E501


def test_chat_generation_chunk() -> None:
    assert ChatGenerationChunk(
        message=HumanMessageChunk(content="Hello, ")
    ) + ChatGenerationChunk(
        message=HumanMessageChunk(content="world!")
    ) == ChatGenerationChunk(
        message=HumanMessageChunk(content="Hello, world!")
    ), "ChatGenerationChunk + ChatGenerationChunk should be a ChatGenerationChunk"

    assert (
        ChatGenerationChunk(message=HumanMessageChunk(content="Hello, "))
        + ChatGenerationChunk(
            message=HumanMessageChunk(content="world!"), generation_info={"foo": "bar"}
        )
        == ChatGenerationChunk(
            message=HumanMessageChunk(content="Hello, world!"),
            generation_info={"foo": "bar"},
        )
    ), "GenerationChunk + GenerationChunk should be a GenerationChunk with merged generation_info"  # noqa: E501

    assert (
        ChatGenerationChunk(message=HumanMessageChunk(content="Hello, "))
        + ChatGenerationChunk(
            message=HumanMessageChunk(content="world!"), generation_info={"foo": "bar"}
        )
        + ChatGenerationChunk(
            message=HumanMessageChunk(content="!"), generation_info={"baz": "foo"}
        )
        == ChatGenerationChunk(
            message=HumanMessageChunk(content="Hello, world!!"),
            generation_info={"foo": "bar", "baz": "foo"},
        )
    ), "GenerationChunk + GenerationChunk should be a GenerationChunk with merged generation_info"  # noqa: E501
